/**
 * 
 */
package com.hs.utils;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;
import java.util.logging.Logger;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import com.hs.core.db.DBOperator;
import com.hs.log.HsLogger;
/**
 * @author shl
 *
 */ 
public class CommonUtil {
	/**
	 * Logger for this class
	 */
	private static final Logger logger = Logger.getLogger(CommonUtil.class.getName());
	
	/**
	 * 日期格式
	 */
	private static String pattern = "yyyy-MM-dd";
	/**
	 * @param args
	 * 小数值=(时×60×60+分×60+秒)/24×60×60
		39295.4704050926  -- 2007年8月1日
		36556.610462963 --2000年1月31日
		39290.6546990741 --2007年7月27日
	 */
	private static SimpleDateFormat dateFormatter = new SimpleDateFormat(pattern);
	SimpleDateFormat allFormatter = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");

	
	/**
	 * 
	 * 功能: 常用的日期格式
	 * 作者: Lihuiming
	 * 创建日期:2007-4-4
	 * @param date
	 * @return
	 */
	public static  String getDateStr(Date date){
		return getDateStr(date,pattern);
	}
	/**
	 * 
	 * 功能: 处理ｉｎｔ类型
	 * 作者:jack.lan
	 * 创建日期:2007-9-10
	 */
	public static String getIntStr(Integer intstr){
		return intstr+"";
	}
	public synchronized static String getDateStr(Date date, String inPattern){
		if(date == null)
			return "";
		SimpleDateFormat sdf=new SimpleDateFormat(inPattern);		
		return sdf.format(date);
	}
	
	/**
	 * 从所有类型中找出当前类型的描述
	 * @param list 所有的类型（格式："类型值_类型描述"）
	 * @param type 类型
	 * @return
	 */
	public synchronized static String getTypeDesc(String[] list , Object type){
		if(type == null)
			return "";
		String desc = "";
		for (int i = 0; i < list.length; i++) {
			String[] typePair = list[i].split("_");
			if(typePair[0].equals(type.toString())){
				desc = typePair[1];
				break;
			}
			
		}
		return desc;
	}
	/**
	 * 取得当前时间的YYYY-MM—DD格式字符串
	 * @return
	 */
	public static String getCurDateStr(){
		String dateStr = "";
		Date date = new Date();
		
		dateStr = dateFormatter.format(date);
		return dateStr;
	}
	 
	/**
	 * 处理数字
	 * @param number
	 * @return
	 */
	public synchronized static String getNumberStr(Object number) {
		String returnStr = "";
		if(number == null)
			return "";
		if(!Verify.isInt(number.toString()))
			return "";
		returnStr = number.toString();
		
		return returnStr;
	}
	/**
	 * 处理数字
	 * @param number
	 * @return
	 */
	public synchronized static String getNotNullsNumberStr(Object number) {
		String returnStr = "";
		if(number == null)
			return "0";
		if(!Verify.isInt(number.toString()))
			return "0";
		returnStr = number.toString();
		
		return returnStr;
	}
	/**
	 * 
	 * 功能: 转义html代码,以便于显示和存储
	 * 作者: Lihuiming
	 * 创建日期:2007-4-4
	 * @param str
	 * @return
	 */
	public synchronized static String Unhtmlcodea(String str){
		 String newstr=str;
		 if(newstr==null || newstr.length()<1)return ""; 
		 
		 newstr=newstr
					 .replace("<","&lt;")
					 .replace(">","&gt;");
		
		 return newstr;
	}
	/**
	 * 处理空字符串
	 * @param str
	 * @return
	 */
	public synchronized static String nvl(Object str){
		if(str instanceof Date)
			return getDateStr((Date)str);
		if(str instanceof Integer)
			return getIntStr((Integer)str);
		return str == null? "":Unhtmlcodea(str.toString());
		
	}

	/**
	 * 处理空字符串, 如果为空用指定的字符串代替
	 * @param str
	 * @param replaceStr
	 * @return
	 */
	public synchronized static String nvl(Object str , String replaceStr){
		if(str instanceof Date)
			return getDateStr((Date)str);
		
		return str == null? replaceStr:str.toString();
		
	}
	
	/**
	 * 日期字符串转换成天数
	 * 2000年1月31日-->36556
	 * @param dateStr
	 * @return
	 */
	public synchronized static String convertToNum(String dateStr){
		boolean isdate = isDateS(dateStr);
		logger.info("isdate======="+isdate);
		if(isdate && (Integer.parseInt(dateStr)> 35000 && Integer.parseInt(dateStr)< 40000))
			return convertDateToInt(dateStr)+".0";
		else
			return dateStr;
		
	}
	/**
	 * 把天数转换成YYYY-MM-DD格式的日期
	 * 36556.610462963 --> 2000年1月31日
	 * @param numberStr
	 * @return
	 */
	public synchronized static String checkStrIsOrNotDate(String numberStr){
		if(isInt(numberStr))
			return convertDate(Integer.parseInt(numberStr));
		else if(isFloat(numberStr)){
			int days = Integer.parseInt(numberStr.split("\\.")[0]);
			if(days > 48000  || days < 30000)
				return numberStr;
			return convertDate(days);
			
		}
		else
			return numberStr;
	}
	/**
	 * 计算小数点后的毫秒数
	 * 36556.610462963 小数点后的数字
	 * @param timeIn
	 * @return
	 */
	public synchronized static Long convertTime(double timeIn){
		return Math.round(timeIn*24*60*60);
	}
	/**
	 * 计算日期距离1899-12-30的天数
	 * @param dateStr
	 * @return
	 */
	public synchronized static int convertDateToInt(String dateStr){
		int days = 0; 
		try {
			Date date = dateFormatter.parse(dateStr);
			java.util.Date date99 = dateFormatter.parse("1899-12-30");
			long l = date.getTime()-date99.getTime();
			days =(int)((l )/(24*60*60*1000));
		} catch (ParseException e) {
			e.printStackTrace();
		}
		return days;
	}
	/**
	 * 根据天数计算YYYY-MM-DD格式的日期
	 * @param daysIn
	 * @return
	 */
	public synchronized static String convertDate(int daysIn){
		java.util.Date reDate = null;
		 try {
			java.util.Date date99 = dateFormatter.parse("1899-12-30");
			java.util.Date date70 = dateFormatter.parse("1970-1-1");
			long day99 = date99.getTime()/(24*60*60*1000);
			long day70 = date70.getTime()/(24*60*60*1000);
			long days = day70 - day99; 
			reDate = (java.util.Date)date99.clone();
			reDate.setTime((daysIn-days)*24*60*60*1000);
			
		} catch (ParseException e) {
			e.printStackTrace();
		}
		return dateFormatter.format(reDate);
	}
	 /**
	  * 是否一个整数
	  * @param value
	  * @return
	  */
    public static boolean isInt( String value ) {
        String p = "^[\\+-]?[0-9]{1,}$";
        return verify(value, p);
    }
	 /**
	  * 是否浮点数
	  * @param value
	  * @return
	  */
    public static boolean isFloat( String value ) {
        String p = "^[0-9]{5}+(\\.{0,1}[0-9]{0,30})$";
        return verify(value, p);
    }
    /**
     * 是否 yyyy-mm-dd 格式的日期
     * @param str
     * @return
     */
    public static boolean isDateS( String str ) {
        String p = "^(((((0[48]00)|(0[1-9]((0[48])|([2468][048])|([13579][26]))))-02-29)|((0[1-9][0-9][0-9])-((((0[13578])|(1[02]))-31)|(((0[1,3-9])|(1[0-2]))-(29|30))|(((0[1-9])|(1[0-2]))-((0[1-9])|(1[0-9])|(2[0-8])))))))|((((((([13579][26])|([2468][048]))00)|([1-9][0-9]((0[48])|([13579][26])|([2468][048]))))-02-29)|(([1-9][0-9][0-9][0-9])-((((0[13578])|(1[02]))-31)|(((0[1,3-9])|(1[0-2]))-(29|30))|(((0[1-9])|(1[0-2]))-((0[1-9])|(1[0-9])|(2[0-8])))))))|((((00((0[48])|([2468][048])|([13579][26])))-02-29)|((00((0[1-9])|([1-9][0-9])))-((((0[13578])|(1[02]))-31)|(((0[1,3-9])|(1[0-2]))-(29|30))|(((0[1-9])|(1[0-2]))-((0[1-9])|(1[0-9])|(2[0-8])))))))$";

        return verify(str, p);
    }
	 /**
	  * 正则表达式校验
	  * @param str
	  * @param pattern
	  * @return
	  */
    public static boolean verify( String str, String pattern ) {
        Pattern p = null; //正则表达式
        Matcher m = null; //操作的字符串
        p = Pattern.compile(pattern);
        m = p.matcher(str);
        return m.matches();
    }
	

	public static void main(String[] args) {
//		String[] s = "39290.6546990741".split("\\.");
//		
//		System.out.println(convertToNum("2000-3-1"));
//		System.out.println(checkStrIsOrNotDate("39290"));
	}
	/**
	 * 去掉毫秒数
	 * @param timeIn
	 * @return
	 */
	public synchronized static String removeTime(String timeIn){
               if(null != timeIn&& (-1!= timeIn.indexOf(".")))
            	   return timeIn.substring(0,timeIn.lastIndexOf("."));
            	   
            return "";	   

	}
	
}
